﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ThaiHoa.Win.QLSX.Entity;
using ThaiHoa.Win.QLSX.Kho.UTI;
using ThaiHoa.Win.QLSX.DAL;
using Excel = Microsoft.Office.Interop.Excel;

namespace ThaiHoa.Win.QLSX.Kho.UI
{
    public partial class frmDonDatHang : Form
    {
        #region Fields
        KhoDBContext db;
        Access acs;
        DonDatHang donDatHang;
        IList<DonDatHangChiTiet> listDonDatHangChiTiet;
        List<DoiTac> listDoiTac;
        List<NguoiDaiDien> listNguoiDaiDien;
        List<MatHang> listMatHang;
        #endregion
        #region Constructor
        public frmDonDatHang()
        {
            InitializeComponent();
        }
        #endregion
        #region Functions
        private void KhoiTao()
        {
            db = new KhoDBContext();
            acs = new Access();
            donDatHang = new DonDatHang();
            dgvDonDatHang.DataSource = donDatHang.DanhSachChiTiet;
            //Thêm column xóa vào gridview
            DataGridViewImageColumn xoaColumn = new DataGridViewImageColumn();
            xoaColumn.Name = "Xoa";
            xoaColumn.HeaderText = "Xóa";
            xoaColumn.Image = Properties.Resources.n_Delete;
            xoaColumn.Width = 30;
            xoaColumn.DisplayIndex = 6;
            dgvDonDatHang.Columns.Add(xoaColumn);
            CustomerGridview();
            //combo mặt hàng
            listMatHang = db.MatHang.Include("DonViTinh").Where(m => m.TrangThai).ToList();
            cbMaMatHang.DataSource = listMatHang;            
            //cbMaMatHang.AutoCompleteSource = listMatHang;
            //combo đối tác
            listDoiTac = db.DoiTac.Include(d=>d.NguoiDaiDien).Where(d => d.TrangThai).ToList();
            cbDoiTac.DataSource = listDoiTac;
            cbDoiTac.DataBindings.Clear();
            //set mặc định cho  textbox
            txtDonGia.Text = "0";
            txtSoLuong.Text = "1";
            txtGhiChu.Text = "";
        }
        private bool KiemTraHopLe()
        {
            bool result = true;
            errP.Clear();
            //kiểm tra nội dung
            if (txtNoiDung.Text == "")
            {
                errP.SetError(txtNoiDung, "Nội dung không được rỗng");
                result = false;
            }
            //kiểm tra đơn vị
            if (cbDoiTac.SelectedItem == null)
            {
                errP.SetError(cbDoiTac, "Đơn vị không hợp lệ");
                result = false;
            }
            //kiểm tra người dại diện
            if (cbNguoiDaiDien.SelectedItem == null)
            {
                errP.SetError(cbNguoiDaiDien, "Người đại diện không hợp lệ");
                result = false;
            }
            return result;
        }
        private void ReLoadData()
        {
            if (db != null) db.Dispose();
            KhoiTao();
        }
        private void LuuLai()
        {
            if (!KiemTraHopLe()) return;
            if (Common.ShowMessengerConfirmSave() == DialogResult.Yes)
            {
                donDatHang.NguoiDaiDien = cbNguoiDaiDien.SelectedItem as NguoiDaiDien;
                donDatHang.DoiTac = cbDoiTac.SelectedItem as DoiTac;
                donDatHang.SoChungTu = txtSoChungTu.Text;
                donDatHang.NoiDung = txtNoiDung.Text;
                donDatHang.Ngay = dtNgayGiaoHang.Value;
                //2 trường hợp thêm mới và edit
                DonDatHang item = db.DonDatHang.Include(n => n.DoiTac).Include(n => n.NguoiDaiDien).Include(n => n.DanhSachChiTiet).FirstOrDefault(n => n.TrangThai && n.Id.Equals(donDatHang.Id));
                if (item != null)//Lưu lại
                {
                    item.NguoiDaiDien = donDatHang.NguoiDaiDien;
                    item.DoiTac = donDatHang.DoiTac;
                    item.SoChungTu = donDatHang.SoChungTu;
                    item.NoiDung = donDatHang.NoiDung;
                    item.Ngay = donDatHang.Ngay;
                }
                else
                {
                    db.DonDatHang.Add(donDatHang);
                }
                db.SaveChanges();
            }
        }
        private bool KiemTraHopLeKhiThemMoi()
        {
            bool result = true;
            errP.Clear();
            if (cbMaMatHang.SelectedItem == null)
            {
                errP.SetError(cbMaMatHang, "Mã mặt hàng không hợp lệ");
                result = false;
            }
            double soLuong;
            if (!double.TryParse(txtSoLuong.Text, out soLuong))
            {
                errP.SetError(txtSoLuong, "Số lượng không hợp lệ");
                result = false;
            }
            if (soLuong <= 0)
            {
                errP.SetError(txtSoLuong, "Số lượng không hợp lệ");
                result = false;
            }
            decimal donGia;
            if (!decimal.TryParse(txtDonGia.Text, out donGia))
            {
                errP.SetError(txtDonGia, "Đơn giá không hợp lệ");
                result = false;
            }
            if (donGia < 0)
            {
                errP.SetError(txtDonGia, "Đơn giá không hợp lệ");
                result = false;
            }
            //kiểm tra ngày nhận hàng
            DateTime ngayNhanHang = dtNgayGiaoHang.Value;
            if (ngayNhanHang == null || ngayNhanHang < DateTime.Now)
            {
                errP.SetError(dtNgayGiaoHang, "Ngày giao hàng không hợp lệ");
                result = false;
            }
            return result;
        }
        private void ThemMatHang()
        {
            if (!KiemTraHopLeKhiThemMoi()) return;
            //Kiểm tra xem đã có  trong danh sách chưa
            MatHang matHang = cbMaMatHang.SelectedItem as MatHang;
            DonDatHangChiTiet item = null;
            if (listDonDatHangChiTiet != null)
            {
                item = listDonDatHangChiTiet.FirstOrDefault(l => l.MatHang.Id.Equals(matHang.Id));
            }
            if (item == null)//trường hợp chưa có
            {
                item = new DonDatHangChiTiet();
                item.MatHang = matHang;
                item.SoLuong = Convert.ToDouble(txtSoLuong.Text);
                item.DonGia = Convert.ToDecimal(txtDonGia.Text);
                item.NgayGiaoHang = dtNgayGiaoHang.Value;
                item.GhiChu = txtGhiChu.Text;
                donDatHang.DanhSachChiTiet.Insert(0,item);
            }
            else//đã có
            {
                double soLuong = Convert.ToDouble(txtSoLuong.Text);
                item.SoLuong += soLuong;
                decimal donGia = Convert.ToDecimal(txtDonGia.Text);
                if (donGia != item.DonGia)
                {
                    //Thay đơn giá cũ bằng đơn giá mới
                    item.DonGia = donGia;
                }
                item.GhiChu = txtGhiChu.Text;
                item.NgayGiaoHang = dtNgayGiaoHang.Value;
            }
            //reload lại gridview
            listDonDatHangChiTiet = donDatHang.DanhSachChiTiet.Where(d => d.TrangThai).ToList();
            dgvDonDatHang.DataSource = listDonDatHangChiTiet;
            CustomerGridview();
            //set mặc định cho  textbox
            txtDonGia.Text = "0";
            txtSoLuong.Text = "1";
            txtGhiChu.Text = "";
        }
        private void CustomerGridview()
        {
            //Ẩn toàn bộ columns
            foreach (DataGridViewColumn item in dgvDonDatHang.Columns)
            {
                item.Visible = false;
            }
            //Tùy chỉnh lại
            //đặt readonly
            dgvDonDatHang.ReadOnly = true;
            //không cho thêm mới
            dgvDonDatHang.AllowUserToAddRows = false;
            //Hiển thị các cột định trước
            //Mã
            var c = dgvDonDatHang.Columns["MatHang"];
            c.Visible = true;
            c.Width = 200;
            c.DisplayIndex = 1;

            //Tên
            c = dgvDonDatHang.Columns["TenMatHang"];
            c.Visible = true;
            c.Width = 200;
            c.DisplayIndex = 2;

            //Đơn vị tính
            c = dgvDonDatHang.Columns["DonViTinh"];
            c.Visible = true;
            c.Width = 100;
            c.DisplayIndex = 3;

            //Số lượng
            c = dgvDonDatHang.Columns["SoLuong"];
            c.Visible = true;
            c.Width = 100;
            c.DisplayIndex = 4;

            //Đơn giá
            c = dgvDonDatHang.Columns["DonGia"];
            c.Visible = true;
            c.Width = 100;
            c.DisplayIndex = 5;
            
            //Ngày giao hàng
            c = dgvDonDatHang.Columns["NgayGiaoHang"];
            c.DefaultCellStyle.Format = "dd/MM/yyyy";
            c.Visible = true;
            c.Width = 100;
            c.DisplayIndex = 6;

            //Ghi Chú
            c = dgvDonDatHang.Columns["GhiChu"];
            c.Visible = true;
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            c.DisplayIndex = 7;

            //Xóa
            c = dgvDonDatHang.Columns["Xoa"];
            c.Visible = true;
            c.Width = 30;
            c.DisplayIndex = 8;
        }
        private void HienThiComboNguoiDaiDien()
        {
        DoiTac doiTac = cbDoiTac.SelectedItem as DoiTac;
        if (doiTac == null) return;
        if (doiTac != null && doiTac.NguoiDaiDien.Count >0)
        {
            listNguoiDaiDien = doiTac.NguoiDaiDien.Where(n => n.TrangThai).ToList();
        }
        cbNguoiDaiDien.DataSource = listNguoiDaiDien;
        }
        private void ExportToExcel()
        {
            donDatHang.NguoiDaiDien = cbNguoiDaiDien.SelectedItem as NguoiDaiDien;
            donDatHang.DoiTac = cbDoiTac.SelectedItem as DoiTac;
            donDatHang.NoiDung = txtNoiDung.Text;
            string workbookPath = Application.StartupPath + @"\Template\Excel\JAT_DonDatHang";
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(workbookPath,
               0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "",
                true, false, 0, true, false, false);
            Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets[1];
            xlWorkBook.Activate();
            xlWorkSheet.Name = "DonDatHang";
            //Add data
            var listDonDatHangChiTiet = donDatHang.DanhSachChiTiet;
            int count = 0;
            int positionStart = 14;
            string start;
            string stop;
            Excel.Range r;
            foreach (DonDatHangChiTiet item in listDonDatHangChiTiet)
            {
                xlWorkSheet.Cells[positionStart + count, 2] = count + 1;
                //Mã mặt hàng
                start = "C" + (count + positionStart).ToString();
                stop = "D" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Merge();
                r.Value2 = item.MatHang.MaMatHang;
                //Mã mặt hàng
                start = "E" + (count + positionStart).ToString();
                stop = "G" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Merge();
                r.Value2 = item.MatHang.TenMatHang;
                xlWorkSheet.Cells[positionStart + count, 8] = item.MatHang.DonViTinh == null ? "" : item.MatHang.DonViTinh.Ten;
                xlWorkSheet.Cells[positionStart + count, 9] = item.SoLuong;
                xlWorkSheet.Cells[positionStart + count, 10] = item.DonGia;
                xlWorkSheet.Cells[positionStart + count, 11] = item.SoLuong * (double)item.DonGia;
                xlWorkSheet.Cells[positionStart + count, 12] = item.NgayGiaoHang.ToString("dd/MM/yyyy");
                xlWorkSheet.Cells[positionStart + count, 13] = item.GhiChu;


                //Format it               

                start = "B" + (count + positionStart).ToString();
                stop = "M" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Borders.Color = Color.Black;
                r.RowHeight = 20;
                //r.Style.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                r.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Excel.XlColorIndex.xlColorIndexAutomatic);
                count++;

            }
            string diaChi = "";
            diaChi =donDatHang.DoiTac.DiaChi;
            xlWorkSheet.Cells[8, 2] = string.Format("Họ và tên người giao hàng: {0}", donDatHang.NguoiDaiDien.HoVaTen);
            xlWorkSheet.Cells[9, 2] = string.Format("Tên đơn vị: {0}", donDatHang.DoiTac.TenDonVi);
            xlWorkSheet.Cells[10, 2] = string.Format("Địa chỉ: {0}", diaChi);
            xlWorkSheet.Cells[11, 2] = string.Format("Nội dung: {0}", donDatHang.NoiDung);
            xlWorkSheet.Cells[7, 12] = string.Format("{0}", donDatHang.SoChungTu);
            xlWorkSheet.Cells[7, 13] = string.Format("{0}", donDatHang.Ngay.ToString("dd/MM/yyyy"));
            // Hiện chương trình
            xlApp.Visible = true;

            //// Save file
            //xlWorkBook.SaveAs("C:\\JAT_VatTu_DanhMucThepTam_1.xls", Excel.XlFileFormat.xlWorkbookNormal,
            //                null, null, false, false,
            //                Excel.XlSaveAsAccessMode.xlExclusive,
            //                false, false, false, false, false);
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
        }
        #endregion
        #region Events
        private void frmDonDatHang_Load(object sender, EventArgs e)
        {
            KhoiTao();
        }
        private void cbMaMatHang_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbMaMatHang.SelectedItem == null) return;
            MatHang item = cbMaMatHang.SelectedItem as MatHang;
            txtTenMatHang.Text = item.TenMatHang;
        }
        private void btnNhap_Click(object sender, EventArgs e)
        {
            ThemMatHang();
        }
        private void cbDonVi_SelectedIndexChanged(object sender, EventArgs e)
        {
            HienThiComboNguoiDaiDien();
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            LuuLai();
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            ReLoadData();
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            ExportToExcel();
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void dgvDonDatHang_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int xoaIndex = dgvDonDatHang.Columns.IndexOf(dgvDonDatHang.Columns["Xoa"]);
            if (e.ColumnIndex == xoaIndex)
            {
                Guid Id = (Guid)dgvDonDatHang.Rows[e.RowIndex].Cells["Id"].Value;
                if (Id != null && Id != Guid.Empty)
                {
                    DonDatHangChiTiet donDatHangChiTiet =donDatHang.DanhSachChiTiet.FirstOrDefault(d => d.TrangThai && d.Id.Equals(Id));
                    if (donDatHangChiTiet != null)
                    {
                        //xóa mặt hàng đó
                        donDatHang.DanhSachChiTiet.Remove(donDatHangChiTiet);
                        //reload lại gridview
                        dgvDonDatHang.DataSource = donDatHang.DanhSachChiTiet.Where(d => d.TrangThai).ToList();
                        CustomerGridview();
                    }
                }
            }
        }
        #endregion

       








    }
}
